# coding: utf-8
# 改进-李咏python的异步io库asyncio和aiohttp
"""
yield from 就是生成器的嵌套，在一个生成器里面使用另外一个生成器，允许一个
generator生成器将其部分操作委派给另一个生成器。

对于简单的迭代器， yield from iterable本质上等于for item in iterable:yield item的缩写版

"""


def g(x):
    yield from range(x, 0, -1)
    yield from range(x)


# print(list(g(10)))
"""
>>> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

"""
# 然而不同的循环， yield from 允许子生成器直接从调用者接受其发送的消息
# 或者抛出调用的时候遇到的异常，并且返回给委派生产器一个值


def accumulate(): # 子生成器，将传入的None的值累加，传进的值如果是None，则返回累加结果
    tally = 0
    while 1:
        next = yield
        if next is None:
            return tally
        tally += next


def gather_tallies(tallies): # 外部 生成器，将累加操作任务委托给子生成器
    while 1:
        tally = yield from accumulate()
        tallies.append(tally)



def func():
    x = 1
    while True:
        y = (yield x)
        x += y


if __name__ == "__main__":
    tallies = []
    acc = gather_tallies(tallies) # 外部生成器，将累加操作任务委托给子生成器
    next(acc) # 使累加生成器准备好接受传入值

    for i in range(4):
        acc.send(i)
    #
    acc.send(None) # 结束第一次的累加
    for i in range(5):
        acc.send(i)
    #
    acc.send(None) # 结束第二次的累加
    print(tallies) # 输出最终结果









